/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.ejb.controlador.juego;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.ejb.modelo.Evento;
import org.ejb.modelo.Juego;
import org.ejb.modelo.Nivel;
import org.ejb.persistencia.Xmljuego;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * Esta clase representa el controlador que cargará un juego para poder ser ejecutado 
 * mediante el script AJAX en la web.
 * @author MoisesAntonio
 */
@Named("juegoController")
@SessionScoped
public class JuegoController implements Serializable {
    
    //Estas son las clases necesarias para poder jugar.
    private Juego juego;
    
    @Inject
    JuegoSeleccionado j;
    
    public  JuegoController() { }
    
    /**
     * Este método lee el juego de la bbdd y lo parsea a los objetos correspondientes.
     * Una vez este método termine, el juego estará cargado en la variable "juego".
     */
    public void comenzarJuego(){
        List<Xmljuego> xml=j.getJuego().getXmljuegoList();
        InputStream stream=new ByteArrayInputStream(xml.get(0).getJuego());
        juego=leerXml(stream);
    }
    
    /**
     * Este métdo cargar el juego en su respectivo POJO's desde la base de datos
     * @param stream El objeto BLOB de la base de datos converitdo a InputStream
     * @return El juego en forma de POJO's para su utilización.
     */
    private Juego leerXml(InputStream stream){
                Juego ju=new Juego();
                try {           //Primero cargamos la info del juego.
                        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                        Document doc = dBuilder.parse(stream);

                        // optional, but recommended
                        // read this -
                        // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
                        doc.getDocumentElement().normalize();

                        //System.out.println("Id del juego: "+ doc.getDocumentElement().getAttribute("id"));
                        //System.out.println("Nombre: "+ doc.getElementsByTagName("name").item(0).getTextContent());
                        //ju=new Juego(doc.getElementsByTagName("name").item(0).getTextContent());
                        
                        //System.out.println("Descripción: "+doc.getElementsByTagName("desc").item(0).getTextContent());
                        //ju.setDescp(doc.getElementsByTagName("desc").item(0).getTextContent());
                        
                        //File n=new File(f.getPath());
                        //System.out.println("Carga del juego: "+f.getParentFile().getAbsolutePath()+"\\game.xml");
                        
                        //Aquí cargamos lo correspondiente a los niveles.
                        //File archivo=new File(f.getParentFile().getAbsolutePath()+"\\game.xml");
                        //String ruta=f.getParentFile().getAbsolutePath()+"\\";
                        
                        //dbFactory = DocumentBuilderFactory.newInstance();
                        //dBuilder = dbFactory.newDocumentBuilder();
                        //doc = dBuilder.parse(f);                  
                        //doc.getDocumentElement().normalize();
                        
                        //System.out.println("Id del juego: "+ doc.getDocumentElement().getAttribute("id"));
                        
                        NodeList nList = doc.getElementsByTagName("level");
                        
                        //Las imágenes hay que cargarlas de la bbdd
                        for(int i=0; i<nList.getLength();i++){
                                Element eElement = (Element) nList.item(i);
                                Nivel n=ju.nuevoNivel();     //Creamos un nivel.
                                n.setNombre(eElement.getAttribute("name"));
                                n.setNumero(Integer.parseInt(eElement.getAttribute("id")));
                                
                                //n.setEscenario(ImageIO.read(new File(ruta+Integer.parseInt(eElement.getAttribute("id"))+".png")));
                                
                                //n.setTipo(TipoNivel.valueOf(eElement.getAttribute("type")));
                                
                                if(Integer.parseInt(eElement.getAttribute("music"))==1){
                                        //Cargamos el sonido.
                                }
                                
                                NodeList lEven= eElement.getChildNodes();
                                
                                for(int k=0; k<lEven.getLength();k++){
                                        Element eve= (Element) lEven.item(k);
                                        int a=Integer.parseInt(eve.getAttribute("posx"));
                                        int b=Integer.parseInt(eve.getAttribute("posy"));
                                        int c=Integer.parseInt(eve.getAttribute("width"));
                                        int d=Integer.parseInt(eve.getAttribute("height"));
                                        int l=Integer.parseInt(eve.getAttribute("level"));
                                        Evento e=new Evento(a,b,c,d);
                                        e.setConexion(l);
                                        n.anadirEvento(e);
                                        
                                }
                                
                        }
            } catch (IOException | NumberFormatException | ParserConfigurationException | SAXException e) {
                
            }
            return ju;
        }
    
}
